using System;
using System.Threading.Tasks;
using System.Windows.Forms;
using TangCaptureTraffic.Forms;
using TangCaptureTraffic.Manager;
using TangCaptureTraffic.Services;

namespace TangCaptureTraffic
{
    /// <summary>
    /// 程序入口类，负责应用程序的启动和初始化
    /// </summary>
    internal static class Program
    {
        /// <summary>
        /// 应用程序的主入口点
        /// </summary>
        [STAThread]  // 指定应用程序的COM线程模型为单线程单元(STA)，这是Windows Forms等UI框架的要求
        static void Main()
        {
            // 初始化应用程序配置，包括高DPI支持、默认字体设置和其他应用程序范围的配置
            // 更多信息请参见 https://aka.ms/applicationconfiguration
            ApplicationConfiguration.Initialize();
            
            // 显示启动窗体
            ShowSplashScreen();
        }

        /// <summary>
        /// 显示启动窗体并执行初始化操作
        /// </summary>
        private static void ShowSplashScreen()
        {
            // 创建启动窗体
            var splashForm = new SplashForm2();
            
            // 创建一个事件来同步窗体显示和初始化任务
            var formShown = new System.Threading.ManualResetEvent(false);
            
            // 监听窗体的Shown事件，当窗体完全显示后触发
            splashForm.Shown += (s, e) => formShown.Set();
            
            // 创建后台任务线程执行初始化操作
            var initTask = Task.Run(async () =>
            {
                try
                {
                    // 等待窗体完全显示
                    formShown.WaitOne();

                    // 初始状态 - 确保窗体显示后再开始更新状态
                    await Task.Delay(300); // 延迟确保UI稳定且用户能看到初始状态
                    await splashForm.UpdateStatus("正在准备初始化...", 0);
                    await Task.Delay(800); // 延长初始状态显示时间，让用户能看到进度条从0开始

                    // 初始化服务容器
                    await splashForm.UpdateStatus("正在初始化服务容器...", 5);
                    await Task.Delay(30);
                    ServiceContainer.InitializeServices();
                    await splashForm.UpdateStatus("服务容器初始化完成", 8);
                    await Task.Delay(30);

                    // 加载配置 - 细分步骤，使用更小的进度增量
                    await splashForm.UpdateStatus("正在加载配置...", 10);
                    await Task.Delay(30);
                    await splashForm.UpdateStatus("正在读取用户设置...", 12);
                    await Task.Delay(30);
                    await splashForm.UpdateStatus("正在应用配置...", 14);
                    await Task.Delay(30);
                    ConfigManager.LoadConfig();
                    await splashForm.UpdateStatus("配置加载完成", 15);
                    await Task.Delay(20);

                    // 初始化证书 - 细分步骤
                    await splashForm.UpdateStatus("正在检查证书状态...", 18);
                    await Task.Delay(30);
                    await splashForm.UpdateStatus("正在准备证书环境...", 22);
                    await Task.Delay(30);
                    await splashForm.UpdateStatus("正在初始化证书...", 26);
                    await Task.Delay(30);
                    await splashForm.UpdateStatus("正在验证证书有效性...", 30);
                    await Task.Delay(30);
                    FiddlerApp.EnsureRootCertificate();
                    await splashForm.UpdateStatus("证书初始化完成", 35);
                    await Task.Delay(20);

                    // 初始化代理服务 - 细分步骤
                    await splashForm.UpdateStatus("正在准备代理服务...", 40);
                    await Task.Delay(30);
                    await splashForm.UpdateStatus("正在配置代理参数...", 45);
                    await Task.Delay(30);
                    await splashForm.UpdateStatus("正在初始化代理服务...", 50);
                    await Task.Delay(30);
                    await splashForm.UpdateStatus("正在注册事件监听器...", 55);
                    await Task.Delay(30);
                    FiddlerApp.AttachEventListeners();
                    await splashForm.UpdateStatus("代理服务初始化完成", 60);
                    await Task.Delay(20);

                    // 启动代理服务 - 细分步骤
                    await splashForm.UpdateStatus("正在准备启动代理服务...", 65);
                    await Task.Delay(30);
                    await splashForm.UpdateStatus("正在配置网络参数...", 70);
                    await Task.Delay(30);
                    await splashForm.UpdateStatus("正在启动代理服务...", 75);
                    await Task.Delay(30);
                    await splashForm.UpdateStatus("正在验证代理服务状态...", 80);
                    await Task.Delay(30);
                    FiddlerApp.StartupFiddlerCore();
                    await splashForm.UpdateStatus("代理服务启动完成", 85);
                    await Task.Delay(20);

                    // 完成初始化 - 细分步骤
                    await splashForm.UpdateStatus("正在完成最终配置...", 88);
                    await Task.Delay(30);
                    await splashForm.UpdateStatus("正在准备主界面...", 92);
                    await Task.Delay(30);
                    await splashForm.UpdateStatus("正在加载界面组件...", 96);
                    await Task.Delay(30);
                    await splashForm.UpdateStatus("初始化完成", 100);
                    await Task.Delay(500); // 显示完成状态

                    //通知UI线程初始化已完成
                    splashForm.Invoke(new Action(() => splashForm.DialogResult = DialogResult.OK));
                }
                catch (Exception ex)
                {
                    // 显示错误信息
                    MessageBox.Show($"初始化过程中发生错误: {ex.Message}", "错误", 
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                    
                    // 通知UI线程初始化失败
                    splashForm.Invoke(new Action(() => splashForm.DialogResult = DialogResult.Cancel));
                }
                finally
                {
                    // 释放事件资源
                    formShown.Dispose();
                }
            });
            
            // 显示启动窗体并等待初始化完成
            DialogResult result = splashForm.ShowDialog();
            
            // 如果初始化成功，显示主窗体
            if (result == DialogResult.OK)
            {
                // 创建并显示主窗体
                var mainForm = new MainForm(true); // 传入true表示已完成初始化
                Application.Run(mainForm);
            }
            else
            {
                // 初始化失败，退出应用程序
                Application.Exit();
            }
        }
    }
}